#include <bits/stdc++.h>
using namespace std;
using LL = long long;
const int N = 1e5 + 5;
vector<int> to[N]; // 存储图的邻接表
int deg[N]; // 存储每个节点的入度
int t[N]; // 存储每个节点的权重

int main() {
  int n, m;
  cin >> n >> m; // 输入节点数和边数
  for (int i = 1; i < n; ++i)
    cin >> t[i]; // 输入每个节点的权重

  for (int i = 1; i < m; ++i) {
    int a, b;
    cin >> a >> b; // 输入边的起点和终点

    to[a].push_back(b); // 将边添加到邻接表
    deg[b]++; // 统计b的入度
  }

  vector<LL> c(n); // 存储每个节点的最大权重和
  queue<int> Q; // 创建队列用于拓扑排序
  for (int v = 1; v <= n; ++v)
    if (!deg[v]) // 如果入度为0，加入队列
      Q.push(v), c[v] = t[v]; // 初始化权重和

  while (Q.size()) {
    int fa = Q.front(); // 取出队首元素
    Q.pop();
    for (int son : to[fa]) { // 遍历子节点
      c[son] = max(c[son], c[fa]); // 更新子节点的权重和
      --deg[son]; // 减少子节点的入度
      if (!deg[son]) { // 如果入度为0
        c[son] += t[son]; // 加上子节点的权重
        Q.push(son); // 加入队列
      }
    }
  }

  LL ans = 0; // 存储最终结果
  for (int i = 1; i <= n; ++i)
    ans = max(ans, c[i]); // 找到最大权重和

  cout << ans << '\n'; // 输出结果

  return 0;
}